Αυτή η ερώτηση έχει ήδη απαντήσεις εδώ: Καμία σιωπηρή μετατροπή σε υπερφορτωμένο χειριστή (2 απαντήσεις) Κλειστό πριν από 7 χρόνια. Γράφω ένα απλό περιτύλιγμα για έναν στοιχειώδη τύπο και προσπαθώ να αποφύγω να χρειαστεί να γράψω πάρα πολλές γεύσεις τυπικών χειριστών. Ήλπιζα ότι η σιωπηρή μετατροπή τύπου θα βοηθούσε, αλλά όχι. Ακολουθεί ένα παράδειγμα: δομή Int { int _i; Int (int i = 0): _i {i} {} Διαχειριστής + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (άκυρο) (Int (1) + 2) // Πρόστιμο (άκυρο) (2 + Int (1)); // σφάλμα: μη έγκυροι τελεστές στη δυαδική έκφραση («int» και «Int») } Χρησιμοποιώ το llvm. Η πρώτη γραμμή των βασικών συλλογών είναι μια χαρά. Το δεύτερο προκαλεί σφάλμα. Τώρα, αυτό που ήλπιζα ότι θα συμβεί στη δεύτερη γραμμή είναι ότι το 2 θα μετατραπεί σιωπηρά σε Int (2), ακολουθούμενο από μια κλήση στον χειριστή +. Γιατί δεν συμβαίνει αυτό; Γιατί συμβαίνει η σιωπηρή μετατροπή στην πρώτη γραμμή;
2021-03-01 08:18:09
Συμβαίνει στην πρώτη γραμμή επειδή ο μόνος τελεστής + διαθέσιμος είναι ο τελεστής + (Int &) (ο οποίος έχει μια σιωπηρή πρώτη παράμετρο Int για αυτήν την περίπτωση). Η δεύτερη γραμμή αποτυγχάνει επειδή η πρώτη παράμετρος είναι int και δεν έχει καμία ένδειξη ότι πρέπει να τη μετατρέψει πριν επιχειρήσει τη λειτουργία (δεν γνωρίζει ότι πρέπει να χρησιμοποιήσει το Int :: operator +). Μπορείτε να αποφύγετε αυτό το πρόβλημα κάνοντας τον χειριστή μια λειτουργία φίλου που δεν είναι μέλος (http://ideone.com/YCf7wX) δομή Int { int _i; Int (int i = 0): _i {i} {} φίλος Int χειριστής + (const Int & lhs, const Int & rhs); }; Διαχειριστής + (const Int & lhs, const Int & rhs) { επιστροφή lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; επιστροφή 0; } | Δεν είναι η απάντηση που ψάχνετε; Περιηγηθείτε σε άλλες ερωτήσεις με ετικέτα c ++ τελεστής-λέξη-κλειδί σιωπηρή μετατροπή ή κάντε τη δική σας ερώτηση.